'''
基线条件（Base Case）:
这是递归的终止条件。当问题规模小到可以直接解决时，递归就会停止，而不是继续调用自身。
递归步骤（Recursive Step）:
这是函数或过程调用自身的部分，但参数通常会发生变化，变得更小或更简化，以向基线条件靠近。

汉诺塔问题源于印度的一个古老传说：梵天创造世界的时候做了三根金刚石柱子，在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上，
并且规定小圆盘上不能放大圆盘，在三根柱子之间一次只能移动一个圆盘。
当所有的黄金圆盘都重新摆放在另一根柱子上时，世界就将在霹雳声中毁灭，梵塔、庙宇和众生都将同归于尽。


'''


def fact(n):
    if n == 1:
        return 1
    else:
        return fact(n - 1) * n


def face2(n):
    a = 1
    while n != 0:
        a = a * n
        n = n - 1
    return a


def hanoi(n, a, b, c):  # n表示需要移动几个圆盘，a代表起始柱，b代表中间柱，c代表目标柱
    if n == 1:  # 如果只剩1个圆盘，那么将圆盘从a柱移动到c柱即可
        print(a, "->", c)
    else:  # 当n > 1时，用抽象出的3步来移动
        hanoi(n - 1, a, c, b)  # 将n-1个圆盘从a移动到b
        hanoi(1, a, b, c)  # 将底盘从a移动到c
        hanoi(n - 1, b, a, c)  # 将b上的n-1个圆盘移动到c


# print(fact(10)
# print(face2(5))
hanoi(10, 'A', 'B', 'C')
